#include <iostream>
#include <string>
#include "46customTime.hpp"
// 运算符重载
// operator +()   重载 + 运算符
// operator *()   重载 * 运算符
// operator op (argument_list);     // op是有效的C++运算符,不能虚构一个C++运算符 比如说@符号,C++中没有@符号

// 当重载了+运算符,在进行对象操作的时候,可以这样使用:
// dist = sid + sara;
// 相当于
// dist = sid.operator+(sara);

// 多数C++运算符都可以用上面这样的方式重载,重载的运算符不必是成员函数，但必须至少有一个操作数是用户定义的类型。
// 下面讲几个C++重载限制的点
// 1. 重载运算符必须，至少有一个操作数是用户定义的类型，这样防止用户为标准类型重载运算符。(比如不能将减法运算符(-)重载为计算两个double值的和)
// 2. 使用运算符时不能违反运算符原来的句法规则。(例如不能将取模运算符(%)重载成使用一个操作数: CustomTime time;  %time;)
// 3. 不能够修改运算符的优先级。新的运算符与原来的符号具有同样的优先级。
// 4. 不能够创建新的运算符。例如不能定义operator **()
// 5. 不能重载以下运算符:
//            sizeof: sizeof运算符
//            . 成员运算符:
//            .* 成员指针运算符
//            :: 作用域解析运算符
//            ?: 条件运算符
//            typeid:  RTTI运算符
//            const_cast: 强制类型转换运算符
//            dynamic_cast: 强制类型转换运算符
//            reinterpret_cast: 强制类型转换运算符
//            static_cast: 强制类型转换运算符

// 6. 下面的运算符只能通过成员函数进行重载
//            = 运算符
//            () 运算符
//            [] 运算符
//            -> 运算符

// 其他的运算符可以通过 成员函数/非成员函数进行重载
// 一定要清楚原理: Obj1 + Obj2 = Obj1.operator +(Obj2)  

// 这里定义一个Time类,用于表示时间  -> ./46customTime.cpp/hpp
int main(int argc, char const *argv[])
{
    using std::cout;
    using std::endl;
    CustomTime aida(3, 35);
    CustomTime tosca(2, 48);
    CustomTime temp;

    cout << "Aida and Tosca:\n";
    cout << aida << "; " << tosca << endl;
    temp = aida + tosca; // 使用CustomTime类中的operator+()
    cout << "Aida + Tosca: " << temp << endl;

// 没有与这些操作数匹配的 "<<" 运算符C/C++(349)
// 46operatorOverloading.cpp(53, 30): 操作数类型为: std::basic_ostream<char, std::char_traits<char>> << CustomTime
// 后续将完善 ostream 重载等

    temp = aida * 1.17; // member operator*()
    cout << "Aida * 1.17: " << temp << endl;
    cout << "10.0 * Tosca: " << 10.0 * tosca << endl;
    return 0;
}
